# -*- coding: utf-8 -*-
"""
日志工具模块
提供统一的日志记录功能，支持控制台输出和文件输出
"""

import sys
from loguru import logger
from pathlib import Path
from config.config import Config


class Logger:
    """
    日志管理类
    基于loguru库实现，提供统一的日志记录接口
    """

    def __init__(self):
        """
        初始化日志配置
        """
        # 移除默认的日志处理器
        logger.remove()

        # 添加控制台输出处理器
        logger.add(
            sys.stdout,
            format=Config.LOG_FORMAT,
            level=Config.LOG_LEVEL,
            colorize=True,  # 启用颜色输出
            backtrace=True,  # 启用异常回溯
            diagnose=True   # 启用诊断信息
        )

        # 添加文件输出处理器
        log_file_path = Config.LOG_DIR / Config.LOG_FILE_FORMAT
        logger.add(
            str(log_file_path),
            format=Config.LOG_FORMAT,
            level=Config.LOG_LEVEL,
            rotation="00:00",  # 每天午夜轮转
            retention=Config.LOG_RETENTION,  # 保留天数
            compression="zip",  # 压缩旧日志文件
            encoding="utf-8",
            backtrace=True,
            diagnose=True
        )

        self.logger = logger

    def info(self, message: str, **kwargs):
        """
        记录信息级别日志

        Args:
            message (str): 日志消息
            **kwargs: 额外的上下文信息
        """
        self.logger.bind(**kwargs).info(message)

    def debug(self, message: str, **kwargs):
        """
        记录调试级别日志

        Args:
            message (str): 日志消息
            **kwargs: 额外的上下文信息
        """
        self.logger.bind(**kwargs).debug(message)

    def warning(self, message: str, **kwargs):
        """
        记录警告级别日志

        Args:
            message (str): 日志消息
            **kwargs: 额外的上下文信息
        """
        self.logger.bind(**kwargs).warning(message)

    def error(self, message: str, **kwargs):
        """
        记录错误级别日志

        Args:
            message (str): 日志消息
            **kwargs: 额外的上下文信息
        """
        self.logger.bind(**kwargs).error(message)

    def critical(self, message: str, **kwargs):
        """
        记录严重错误级别日志

        Args:
            message (str): 日志消息
            **kwargs: 额外的上下文信息
        """
        self.logger.bind(**kwargs).critical(message)

    def exception(self, message: str, **kwargs):
        """
        记录异常信息（包含异常堆栈）

        Args:
            message (str): 日志消息
            **kwargs: 额外的上下文信息
        """
        self.logger.bind(**kwargs).exception(message)

    def test_step(self, step_name: str, step_desc: str = "", **kwargs):
        """
        记录测试步骤日志

        Args:
            step_name (str): 步骤名称
            step_desc (str): 步骤描述
            **kwargs: 额外的上下文信息
        """
        message = f"【测试步骤】{step_name}"
        if step_desc:
            message += f" - {step_desc}"
        self.logger.bind(step=step_name, **kwargs).info(message)

    def test_case_start(self, case_name: str, case_desc: str = "", **kwargs):
        """
        记录测试用例开始日志

        Args:
            case_name (str): 用例名称
            case_desc (str): 用例描述
            **kwargs: 额外的上下文信息
        """
        message = f"【测试用例开始】{case_name}"
        if case_desc:
            message += f" - {case_desc}"
        self.logger.bind(case=case_name, **kwargs).info("=" * 80)
        self.logger.bind(case=case_name, **kwargs).info(message)
        self.logger.bind(case=case_name, **kwargs).info("=" * 80)

    def test_case_end(self, case_name: str, result: str = "PASS", **kwargs):
        """
        记录测试用例结束日志

        Args:
            case_name (str): 用例名称
            result (str): 测试结果 (PASS/FAIL)
            **kwargs: 额外的上下文信息
        """
        message = f"【测试用例结束】{case_name} - 结果: {result}"
        self.logger.bind(case=case_name, result=result, **kwargs).info(message)
        self.logger.bind(case=case_name, **kwargs).info("=" * 80)

    def api_request(self, method: str, url: str, **kwargs):
        """
        记录API请求日志

        Args:
            method (str): HTTP方法
            url (str): 请求URL
            **kwargs: 额外的上下文信息
        """
        message = f"【API请求】{method.upper()} {url}"
        self.logger.bind(method=method, url=url, **kwargs).info(message)

    def api_response(self, status_code: int, response_time: float = None, **kwargs):
        """
        记录API响应日志

        Args:
            status_code (int): HTTP状态码
            response_time (float): 响应时间（毫秒）
            **kwargs: 额外的上下文信息
        """
        message = f"【API响应】状态码: {status_code}"
        if response_time:
            message += f", 响应时间: {response_time:.2f}ms"
        self.logger.bind(status_code=status_code, response_time=response_time, **kwargs).info(message)


# 创建全局日志实例
log = Logger()
